/*
 * Copyright [2022] [https://www.xiaonuo.vip]
 *
 * Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *
 * 1.请不要删除和修改根目录下的LICENSE文件。
 * 2.请不要删除和修改Snowy源码头部的版权声明。
 * 3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 * 4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 * 5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 * 6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.biz.modular.cabinetpermission.task;

import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Component;
import vip.xiaonuo.common.enums.BizPermissionEnum;
import vip.xiaonuo.biz.modular.cabinetpermission.entity.BizCabinetPermission;
import vip.xiaonuo.biz.modular.cabinetpermission.mapper.BizCabinetPermissionMapper;
import vip.xiaonuo.common.timer.CommonTimerTaskRunner;

import javax.annotation.Resource;
import java.util.Date;

/**
 * 根据时间刷新权限状态定时器
 *
 * @author kongxm
 * @date 2022/12/7 15:52
 **/
@Component
public class BizPermissionTimerTaskRunner implements CommonTimerTaskRunner {
    @Resource
    private BizCabinetPermissionMapper cabinetPermissionMapper;

    @Override
    public void action() {
        Date now = new Date();
        // 查询状态是已授权，但是授权时间已经过了的所有记录
        cabinetPermissionMapper.selectList(new LambdaQueryWrapper<BizCabinetPermission>()
                .eq(BizCabinetPermission::getPermState, BizPermissionEnum.AUTHORIZED.name())
                .lt(BizCabinetPermission::getPermEndTime, now)).forEach(item -> {
            BizCabinetPermission perm = new BizCabinetPermission();
            perm.setId(item.getId());
            perm.setPermState(BizPermissionEnum.EXPIRED.name()); // 更新为已过期
            cabinetPermissionMapper.updateById(perm);
        });


        // // 查询状态是已冻结，但是冻结时间已经过了的所有记录
        cabinetPermissionMapper.selectList(new LambdaQueryWrapper<BizCabinetPermission>()
                .eq(BizCabinetPermission::getPermState, BizPermissionEnum.FROZEN.name())
                .lt(BizCabinetPermission::getFrozenEndTime, now)).forEach(item -> {


            BizCabinetPermission perm = new BizCabinetPermission();
            perm.setId(item.getId());
            perm.setFrozenEndTime(now);

            // 如果授权开始时间与结束时间不为空
            if (item.getPermStartTime() != null && item.getPermEndTime() != null) {
                if (DateUtil.isIn(now, item.getPermStartTime(), item.getPermEndTime())) {
                    // 并且当前时间在授权时间区间内,设置为已授权
                    perm.setPermState(BizPermissionEnum.AUTHORIZED.name());
                } else if (now.after(item.getPermEndTime())) {
                    // 当前时间大于授权时间，设置为授权已过期
                    perm.setPermState(BizPermissionEnum.EXPIRED.name());
                }
            } else {
                // 如果没有授权过，那就是未授权。
                perm.setPermState(BizPermissionEnum.UNAUTHORIZED.name());
            }

            cabinetPermissionMapper.updateById(perm);
        });
    }
}
